package com.wbk.lotterysystemuserservice.service.serviceImpl;

import com.wbk.lotterysystemuserservice.commons.bo.StoreApplyBO;
import com.wbk.lotterysystemuserservice.entity.Store;
import com.wbk.lotterysystemuserservice.entity.StoreExample;
import com.wbk.lotterysystemuserservice.mapper.StoreMapper;
import com.wbk.lotterysystemuserservice.service.StoreService;
import com.wbk.user.qo.StoreAuditQO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class StoreServiceImpl implements StoreService {

    @Autowired
    StoreMapper storeMapper;

    @CacheEvict(cacheNames = "store::byStoreUserNo", key = "#result.storeUserNo")
    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public Store save(StoreApplyBO storeApplyBO) {
        Store store = new Store();
        BeanUtils.copyProperties(storeApplyBO, store);
        store.setStoreUserNo(storeApplyBO.getUserNo());
        store.setAuditStatus((byte) 0);
        storeMapper.insertSelective(store);
        return store;
    }

    @CacheEvict(cacheNames = "store::byStoreUserNo", key = "#result.storeUserNo")
    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public Store update(Store store) {
        storeMapper.updateByPrimaryKeySelective(store);
        return store;
    }

    @Override
    public List<Store> getAllStore() {
        StoreExample storeExample = new StoreExample();
        StoreExample.Criteria criteria = storeExample.createCriteria();
        criteria.andAuditStatusEqualTo((byte) 1);
        storeExample.setOrderByClause("store_user_no asc");
        return storeMapper.selectByExample(storeExample);
    }

    @Override
    public List<Store> getAllStoreWithoutAudit() {
        StoreExample storeExample = new StoreExample();
        StoreExample.Criteria criteria = storeExample.createCriteria();
        criteria.andAuditStatusEqualTo((byte) 0);
        storeExample.setOrderByClause("store_user_no asc");
        return storeMapper.selectByExample(storeExample);
    }

    @Cacheable(cacheNames = "store::byStoreUserNo", key = "#storeUserNo")
    @Override
    public Store getStoreByUserNo(Long storeUserNo) {
        StoreExample storeExample = new StoreExample();
        StoreExample.Criteria criteria = storeExample.createCriteria();
        criteria.andStoreUserNoEqualTo(storeUserNo);
        List<Store> stores = storeMapper.selectByExample(storeExample);
        if (stores.isEmpty()) {
            return null;
        }
        return stores.get(0);
    }

    @CacheEvict(cacheNames = "store::byStoreUserNo", key = "#store.storeUserNo")
    @Override
    public int audit(Store store) {
        return storeMapper.updateByPrimaryKeySelective(store);
    }
}
